package middleware

import (
	"api-gateway/pkg"
	"github.com/gin-gonic/gin"
)

// DoctorAuthToken 医生端认证中间件
// 验证医生身份，确保只有登录的医生才能访问受保护的接口
func DoctorAuthToken() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头获取 token
		// 支持两种方式：1. Authorization: Bearer token  2. token: xxx
		token := c.Request.Header.Get("Authorization")
		if token == "" {
			token = c.Request.Header.Get("token")
		} else {
			// 如果是 Bearer token，需要去掉 "Bearer " 前缀
			if len(token) > 7 && token[:7] == "Bearer " {
				token = token[7:]
			}
		}

		// 检查 token 是否为空
		if token == "" {
			c.JSON(401, gin.H{
				"code": 401,
				"msg":  "请先登录",
				"data": nil,
			})
			c.Abort()
			return
		}

		// 解析 token，获取医生信息
		doctorId, err := pkg.ParseJwtToken(token)
		if err != nil {
			c.JSON(401, gin.H{
				"code": 401,
				"msg":  "登录已过期，请重新登录",
				"data": nil,
			})
			c.Abort()
			return
		}

		// 这里可以进一步验证医生角色和资质状态
		// 例如：从 token 中解析出角色信息，确保是医生角色
		// role := ... // 从 token 或数据库中获取角色
		// if role != "doctor" {
		// 	c.JSON(403, gin.H{
		// 		"code": 403,
		// 		"msg":  "无权访问",
		// 		"data": nil,
		// 	})
		// 	c.Abort()
		// 	return
		// }

		// 可以检查医生的审核状态
		// auditStatus := ... // 从数据库获取医生审核状态
		// if auditStatus != "approved" {
		// 	c.JSON(403, gin.H{
		// 		"code": 403,
		// 		"msg":  "您的资质审核尚未通过，暂时无法使用此功能",
		// 		"data": nil,
		// 	})
		// 	c.Abort()
		// 	return
		// }

		// 将医生信息设置到上下文中，后续的 handler 可以使用
		c.Set("doctorId", doctorId)
		c.Set("userType", "doctor") // 标记用户类型为医生

		// 继续执行后续的处理器
		c.Next()
	}
}

